package cn.itsource.pethome.base.superr;

import cn.hutool.core.util.StrUtil;
import cn.itsource.pethome.base.domain.BaseDomain;
import cn.itsource.pethome.base.domain.BaseQuery;
import cn.itsource.pethome.base.domain.PageResult;
import cn.itsource.pethome.org.domain.Department;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.entity.Example;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
 * 抽取mapper
 */
public interface MyBaseMapper<T extends BaseDomain> extends Mapper<T> {
    //创建的一个方法,返回的是当前的T的泛型
    Class<T> getTClass();

    /**
     * 1.分页高级查询
     *
     */
    default PageResult findPage(BaseQuery query){
        List<T> list = null;
        PageHelper.startPage(query.getPage(),query.getPageSize());
        //1.创建一个 example
        Example example = new Example(getTClass());
        //2.获取条件
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("del",Boolean.TRUE);
        //StrUtil.isBlank 除了判断是否为null 还判断当前的数据类型 以及是否为""
        if (StrUtil.isBlank(query.getKeyword())){
            //1.创建分页对象
             list = this.selectByExample(example);

            //3条件查询
        }else {
            //这是获取当前类的所有字段
//            Field[] declaredFields = query.getClass().getDeclaredFields();
//
//            Arrays.asList(declaredFields).forEach(field -> {
//                //首先暴力破解该字段,可以拿到private修饰的字段
//                field.setAccessible(true);
//                //第一步:获取字段名
//                String fieldName = field.getName();
//                //第二步 : 拿到当前字段的值
//                Object o  = null;
//                try {
//                     o = field.get(query);
//                } catch (IllegalAccessException e) {
//                    e.printStackTrace();
//                }
//                if (Objects.nonNull(o)){
//                    criteria.andEqualTo(fieldName,o) ;
//                }
//            });
            criteria.andLike("name","%"+query.getKeyword()+"%");
            //1.创建分页对象
            list = this.selectByExample(example);

        }
        PageInfo<T> tPageInfo = new PageInfo<>(list);
        PageResult pageResult = new PageResult(tPageInfo.getTotal(), tPageInfo.getList());
        return pageResult;

    }

    /**
     * 2.批量删除
     * @param ids
     */
    default void DeleteBatch(List<Long> ids) throws Exception {
        T t = getTClass().newInstance();
        t.setDel(Boolean.FALSE);
        //1.创建一个 example
        Example example = new Example(getTClass());
        //2.获取条件
        Example.Criteria criteria = example.createCriteria();
        criteria.andIn("id",ids);
        this.updateByExampleSelective(t,example);
    }



    public static void main(String[] args) {
        Department department = new Department();
        department.setName("研发部");
        department.setId(1L);
        //这是获取当前类的所有字段
            Field[] declaredFields = department.getClass().getDeclaredFields();

            Arrays.asList(declaredFields).forEach(field -> {
                //首先暴力破解该字段,可以拿到private修饰的字段
                field.setAccessible(true);
                //第一步:获取字段名
                String fieldName = field.getName();
                //第二步 : 拿到当前字段的值
                Object o  = null;
                try {
                     o = field.get(department);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                if (Objects.nonNull(o)){
                    System.out.println("当前对象的字段名:"+fieldName+"当前对象的字段的值:"+o);
                }
            });
    }

}